# ====================== vrp_model.py ======================
import numpy as np

# 客户类---定义配送点相关参数（含仓库）
class Customer:
    # 定义该类的属性
    def __init__(self, id, x, y, demand, volume, early, late, staytime):
        self.id = id # 客户点序号
        self.x = x # 经度
        self.y = y # 纬度
        self.demand = demand # 货物需求量
        self.volume = volume # 货物容积
        self.early = early  # 最早服务时间（分钟）
        self.late = late   # 最晚服务时间（分钟）
        self.staytime = staytime # 车辆在配送点的停留时间

class Vehicle:
    def __init__(self, max_car_nums=32, capacity=2000, volume=12.763842, max_range=200,
                charged_time=300, distance_cost=0.5, charge_cost=0.2, chance_cost=0.2,
                 fixed_cost=200, early_arrive_penalty=2, late_arrive_penalty=5):
        self.max_car_nums = max_car_nums      # 车辆数（默认为32辆）
        self.capacity = capacity              # 车辆最大载重量(默认为2t)
        self.volume = volume                  # 车辆最大装载容积（默认为12.763842）
        self.max_range = max_range            # 车辆最大续航里程(默认为200km)
        self.charged_time = charged_time        # 车辆从0到充满电的时间（默认为300min）
        self.distance_cost = distance_cost    # 车辆运输成本（默认0.5元/公里）
        self.charge_cost = charge_cost            # 车辆充电成本（默认0.2元/分钟）
        self.chance_cost = chance_cost            # 车辆充电占用的机会成本（默认0.2元/分钟）
        self.fixed_cost = fixed_cost          # 元/车次---每辆车的固定成本(默认200元/天)
        self.early_arrive_penalty = early_arrive_penalty  # 时间窗惩罚成本---早到罚金（默认2元/min）
        self.late_arrive_penalty = late_arrive_penalty    # 时间窗惩罚成本---晚到罚金（默认5/min）


class VRPTWInstance:
    def __init__(self, customers, depot, distance_matrix, time_matrix, vehicle):
        self.customers = customers    # 客户列表（含仓库）---列表中存放的是客户类Customer对象（含仓库对象）---即配送点相关参数
        self.depot = depot            # 仓库对象
        self.distance_matrix = distance_matrix  # 两点间距离矩阵
        self.time_matrix = time_matrix          # 两点间距离耗费的时间矩阵
        self.vehicle = vehicle        # 车辆配置---即车辆的相关参数
        self._fitness_cache = {}      # 适应度缓存---字典---键值对形式存储所有已知路径及其所有相关信息

    def clear_cache(self):
        """清空适应度缓存"""
        self._fitness_cache.clear()